package v1

import (
	"hr/api/dto"
	"hr/api/middleware"
	"hr/db"
	"hr/pkg/miniapp"
	"hr/service"
	"hr/utils"
	"time"

	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
)

// GetMiNiAppPaging
// @Summary 获取所有用户管理（小程序）
// @Tags 用户管理（小程序）相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param pageNo query string true "页码"
// @Param pageSize query string true "页大小"
// @Param phone query string false "手机号"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user_manage/getMiNiAppPaging [get]
func GetMiNiAppPaging(c *gin.Context) {
	pageNoStr := c.Query("pageNo")
	pageSizeStr := c.Query("pageSize")
	name := c.Query("phone")

	var pageNo, pageSize int
	if !utils.IsStringEmpty(pageNoStr) {
		pageNo = cast.ToInt(pageNoStr)
	}
	if !utils.IsStringEmpty(pageSizeStr) {
		pageSize = cast.ToInt(pageSizeStr)
	}
	paging := &dto.Pagination{
		PageNo:   pageNo,
		PageSize: pageSize,
	}

	d, err := db.GetUserManagePaging(*paging, name)
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "请求成功")
	return
}

// GetUserManage
// @Summary 获取所有用户管理（小程序）
// @Tags 用户管理（小程序）相关api
// @Accept  json
// @Produce json
// @Param code query string false "小程序code"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/user_manage/getMiNiApp [get]
func GetUserManage(c *gin.Context) {
	code := c.Query("code")
	if utils.IsStringEmpty(code) {
		utils.EchoError(c, "code不能为空")
		return
	}
	opendId, err := miniapp.GetCode2Session(code)
	if utils.IsStringEmpty(code) {
		utils.EchoError(c, err.Error())
		return
	}

	u, err, tag := db.GetUsers(map[string]interface{}{
		"open_id": opendId,
	})
	expireTime := time.Hour * 24
	if tag == "2" {
		if u.Status == "1" {
			utils.EchoError(c, "您已限制登录，请联系管理员")
			return
		}
		calsm := middleware.JwtModel{
			StandardClaims: jwt.StandardClaims{
				Issuer:    "hsyedu.com",
				Id:        cast.ToString(u.ID),
				ExpiresAt: time.Now().Add(expireTime).Unix(),
				IssuedAt:  time.Now().Unix(),
				NotBefore: time.Now().Unix(),
			},
		}
		token, err := middleware.CreateJWT(calsm)
		if err != nil {
			utils.EchoError(c, err.Error())
			return
		}
		_ = service.FileCache.Save(cast.ToString(u.ID), token, expireTime)
		utils.EchoSuccess(c, map[string]interface{}{
			"user":  u,
			"token": token,
		}, "登录成功")
		return
	} else {
		pwd := utils.Md5V("123456")
		d := &dto.UserRequest{
			OpenId:   opendId,
			Status:   "2",
			DeptID:   1,
			Password: pwd,
		}
		m, err := db.CreateUser(*d, "")
		if err != nil {
			utils.EchoError(c, err.Error())
			return
		}
		calsm := middleware.JwtModel{
			StandardClaims: jwt.StandardClaims{
				Issuer:    "hsyedu.com",
				Id:        cast.ToString(m.ID),
				ExpiresAt: time.Now().Add(expireTime).Unix(),
				IssuedAt:  time.Now().Unix(),
				NotBefore: time.Now().Unix(),
			},
		}

		token, err := middleware.CreateJWT(calsm)
		if err != nil {
			utils.EchoError(c, err.Error())
			return
		}
		_ = service.FileCache.Save(cast.ToString(m.ID), token, expireTime)
		utils.EchoSuccess(c, map[string]interface{}{
			"user":  m,
			"token": token,
		}, "登录成功")
		return
	}
}

// GetUserPhone
// @Summary 获取小程序手机号
// @Tags 用户管理（小程序）相关api
// @Accept  json
// @Produce json
// @Param MiNiAppPhoneRequest body dto.MiNiAppPhoneRequest true "信息"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/getMiNiAppPhone [post]
func GetUserPhone(c *gin.Context) {
	p := &dto.MiNiAppPhoneRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}
	src, err := miniapp.GetPhone(p.Code, p.EncryptedData, p.Iv)
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, src, "获取成功")
	return
}

// GetMiNiAppUserInfo
// @Summary 获取小程序用户信息
// @Tags 用户管理（小程序）相关api
// @Accept  json
// @Produce json
// @Param MiNiAppPhoneRequest body dto.MiNiAppPhoneRequest true "信息"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/getMiNiAppUserInfo [post]
func GetMiNiAppUserInfo(c *gin.Context) {
	p := &dto.MiNiAppPhoneRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}
	src, err := miniapp.GetUserInfo(p.Code, p.RawData, p.EncryptedData, p.Signature, p.Iv)
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, src, "获取成功")
	return
}

// CreateUserManage
// @Summary 创建用户管理（小程序）类型
// @Tags 用户管理（小程序）相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param UserManageRequest body dto.UserManageRequest true "信息"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user_manage [post]
func CreateUserManage(c *gin.Context) {
	p := &dto.UserManageRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}
	id, _ := middleware.GetCurrentUserId(c)
	m, err := db.CreateUserManage(*p, cast.ToString(id))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, m, "创建成功")
	return
}

// UpdateUserManage
// @Summary 更新用户管理（小程序）
// @Tags 用户管理（小程序）相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param UserManageRequest body dto.UserManageRequest true "信息"
// @Param id path string true "主键ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user_manage/{id} [put]
func UpdateUserManage(c *gin.Context) {
	p := &dto.UserManageRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c, "缺少必要参数信息")
		return
	}
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c, "缺少ID")
		return
	}
	_, _, tag := db.GetUserManage(map[string]interface{}{"id": idStr})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "此用户管理（小程序）不存在")
		return
	}
	id, _ := middleware.GetCurrentUserId(c)
	m, err := db.UpdateUserManage(cast.ToUint(idStr), *p, cast.ToString(id))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}

	utils.EchoSuccess(c, m, "更新成功")
	return
}

// DeleteUserManage
// @Summary 删除用户管理（小程序）
// @Tags 用户管理（小程序）相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param id path string true "主键ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/user_manage/{id} [delete]
func DeleteUserManage(c *gin.Context) {
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c, "缺少ID")
		return
	}
	_, _, tag := db.GetUserManage(map[string]interface{}{"id": idStr})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "此用户管理（小程序）不存在")
		return
	}
	_, err := db.DeleteUserManage(cast.ToUint(idStr))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}

	utils.EchoSuccess(c, nil, "删除成功")
	return
}
